﻿#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<stdlib.h>



//struct Book
//{
//	char name[20];
//	char author[12];
//	float price;
//}b1;


//struct //匿名结构体
//{
//	char name[20];
//	char author[12];
//	float price;
//}b1, b2;
//struct Student
//{
//	char name[20];
//	int age;
//	char sex[5];
//	float score;
//} s1, s2, s3;//s1, s2, s3 是三个结构体变量 - 全局变量
//int main()
//{
//	char buffer[20];
//	//s1.age = 10;
//	sprintf(s1.name, "zhangsan");
//	//s1.score = 100;
//	//s1.sex = '男';
//
//	struct Student s4 = {.age= 18,.name="lisi",.sex="男",.score=99.0 };
//	struct Student s5 = { "zhaoliu",20,"女",60 };
//	s5.score = 100;
//	//printf("%s\n", buffer);
//	printf("%s %d %f %s\n", s4.name,s4.age ,s4.score, s4.sex);
//	printf("%d %s %f %s", s5.age, s5.name, s5.score, s5.sex);
//	return 0;
//}


//struct a
//{
//	char a;
//	char c;
//	int b;
//};
//struct b
//{
//	char a;
//	int b;
//	char c;
//};
//
//int main()
//{
//	printf("%d\n", sizeof(struct a));
//	printf("%d\n\n", sizeof(struct b));
//
//	printf("%d\n", offsetof(struct a, a));
//	printf("%d\n", offsetof(struct a, b));
//	printf("%d\n\n", offsetof(struct a, c));
//
//	printf("%d\n", offsetof(struct b, a));
//	printf("%d\n", offsetof(struct b, b));
//	printf("%d\n", offsetof(struct b, c));
//	return 0;
//}

//练习1
//struct S1
//{
//	char c1;
//	int i;
//	char c2;
//};
//
//练习2
//struct S2
//{
//	char c1;
//	char c2;
//	int i;
//};
//练习3
//struct S3
//{
//	double d;
//	char c;
//	int i;
//};
//struct S4
//{
//	char c1;
//	struct S3 s3;
//	double d;
//};
//int main()
//{
//	printf("%d\n", sizeof(struct S4));
//
//
//	return 0;
//}

#pragma pack(8)//设置默认对齐数为8
//struct S1
//{
//	char c1;
//	int i;
//	char c2;
//};
//#pragma pack()//取消设置的默认对齐数，还原为默认
//#pragma pack(1)//设置默认对齐数为1
//struct S2
//{
//	char c1;
//	int i;
//	char c2;
//};
//#pragma pack()//取消设置的默认对齐数，还原为默认
//int main()
//{
//	//输出的结果是什么？
//	printf("%d\n", sizeof(struct S1));
//	printf("%d\n", sizeof(struct S2));
//	return 0;
//}

//struct 
//{
//	char i;
//}*p;
//struct
//{
//	char i;
//}a;
//int main()
//{
//	p = &a;
//	return 0;
//}

//代码1
//struct Node
//{
//	int data;
//	struct Node next;
//};
//int mian()
//{
//	printf("%zd", sizeof(struct Node));
//	return 0;
//}

//struct Point
//{
//	int x;
//	int y;
//}p1; //声明类型的同时定义变量p1
//struct Node
//{
//	int data;
//	struct Point p;
//	struct Node* next;
//}n1 = { 10, {4,5}, NULL }; //结构体嵌套初始化
//struct Node n2 = { 20, {5, 6}, NULL };//结构体嵌套初始化
//struct Node n3 = { .data = 0,.p.x = 0,.p.y = 0,.next = NULL };// .类型初始化
//
//typedef struct
//{
//	int data;
//	Node* next;
//}Node;
//int main()
//{
//	struct Node n3 = { .data = 0,.p.x = 0,.p.y = 0,.next = NULL };
//
//	return 0;
//}
#pragma pack(1)

//struct A
//{
//	char a;
//	int b;
//};
//
//struct B
//{
//	char a;
//	struct A c;
//	double d;
//};
//
//int main()
//{
//	printf("%d \n", sizeof(struct A));
//
//	printf("%d \n", sizeof(struct B));
//
//	return 0;
//}

#pragma pack()

//struct student
//{
//	char name[20];
//	int age;
//	float hight;
//};
//void print(struct student s)
//{
//	printf("%s  %d  %f\n", s.name, s.age, s.hight);
//}
//void print1(struct student* s)
//{
//	printf("%s %d %f\n", s->name, s->age, s->hight);
//}
//int main()
//{
//	struct student s1 = { "zhangsan",18,155.0 };
//	struct student s2 = { "lisi",20,160.0 };
//
//	print(s1);
//	print1(&s2);
//	return 0;
//}

//位段
//struct A
//{
//	char q : 1;
//	char w : 1;
//	char e : 1;
//	char r : 1;
//	char t : 1;
//	char y : 1;
//	char u : 1;
//	char i : 1;
//	int a : 1;
//	int b : 2;
//	int c : 1;
//};
//
//struct B
//{
//	char q ;
//	char w ;
//	char e ;
//	char r ;
//	char t ;
//	char y ;
//	char u ;
//	char i ;
//	int a :1;
//};
//struct C
//{
//	int _a : 2;
//	int _b : 5;
//	int _c : 10;
//	int _d : 30;
//};

//struct A
//{
//	int _a : 2;
//	int _b : 5;
//	int _c : 10;
//	int _d : 30;
//};

//struct S
//{
//	char _a : 3;
//	char _b : 4;
//	char _c : 5;
//	char _d : 4;
//};
//int main()
//{
//	struct S s = { 0 };
//	s._a = 10;
//	s._b = 12;
//	s._c = 3;
//	s._d = 4;
//	printf("%d\n", sizeof(struct S));
//	return 0;
//}


//int main()
//{
//	printf("%d \n", sizeof(struct A));
//	printf("%d \n", sizeof(struct B));
//	printf("%d \n", sizeof(struct C));
//	return 0;
//}


//union s
//{
//	char i[5];
//	int j;
//};
//int main()
//{
//	printf("%d\n", sizeof(union s));
//	return 0;
//}

//enum Color//颜色
//{
//	RED = 1,
//	GREEN = 2,
//	BLUE = 4,
//	YELLOW
//};
//enum Color w = GREEN;//只能拿枚举常量给枚举变量赋值，才不会出现类型的差异。
//w = YELLOW;
//
//int i = 0;
//i = 1;
//int main()
//{
//	enum Color s = BLUE;
//	printf("%d \n", s);
//	s = YELLOW;
//	printf("%d \n", s);
//	printf("%d \n", w);
//
//	return 0;
//}

//联合类型的声明
//union Un
//{
//	char c;
//	int i;
//};
//联合变量的定义
//union Un un;
//计算连个变量的大小
//int main()
//{
//	printf("%d\n", sizeof(un));
//	return 0;
//}


//union Un
//{
//	int i;
//	char c;
//};
//union Un un;
//int main()
//{
//	// 下面输出的结果是一样的吗？答：  一样
//	printf("%p\n", &(un.i));
//	printf("%p\n\n", &(un.c));
//	//下面输出的结果是什么？
//	un.i = 0x11223344;
//	un.c = 0x55;
//	printf("%x\n", un.i);
//	return 0;
//}

//union u
//{
//	int i;
//	char j;
//};
//int check_sys()
//{
//	union u s = { 1 };
//	return s.j;
//}
//int check_sys2()
//{
//	int x = 1;
//	return *(char*)&x;
//}
//int main()
//{
//	int ret=check_sys();
//	//int ret = check_sys2();
//	if (ret == 1)
//		printf("小端\n");
//	else
//		printf("大端");
//	return 0;
//}

//union Un1
//{
//	char c[5];
//	int i;
//};
//union Un2
//{
//	short c[7];
//	int i;
//};
//int main()
//{
//	//下面输出的结果是什么？
//	printf("%d\n", sizeof(union Un1));
//	printf("%d\n", sizeof(union Un2));
//	return 0;
//}


struct B
{
	double b;
	int j;
};
union A
{
	char i;
	//double a;
	int v[3];
	struct B;
};
int main()
{
	printf("%d\n", sizeof(struct B));
	printf("%d\n", sizeof(union A));
	return 0;
}










